package AlgoritmosGeneticos.model.impl.mutuaciones;

import AlgoritmosGeneticos.model.Individuo;

public class MutacionNoUniforme extends MutacionBasica{

	private int iteracion;
	private int lapso;
	private double porcentajeDecrementado;
	
	/**
	 * Este tipo de mutación varia el probabilidad de mutación de un individuo
	 * en funcion de un lapso de iteraciones. Concretamente disminuye la misma
	 * si ya al pasado un lapso de iteraciones dado.
	 * 
	 * @param lapso					 cantidad de iteraciones que tiene que pasar para decrementear la probabilidad
	 * @param porcentajeDecrementado porcentaje de la probabilidad anterior que disminuye
	 */
	
	public MutacionNoUniforme(int lapso, double porcentajeDecrementado) {
		System.out.println("Mutacion no uniforme");
		this.lapso=lapso;
		this.porcentajeDecrementado=porcentajeDecrementado;
		this.iteracion=0;
	}
	
	/**
	 * incrementa el contro de las iteraciones
	 */
	
	public void increseIteration(){
		this.iteracion++;
	}
	
	/**
	 *  Muta un individuo dado. Si paso un lapso de iteraciones disminuye 
	 *  la probabilidad de mutacion de dicho individuo
	 */
	
	@Override
	public Individuo mutar(Individuo ind) {
		if(this. iteracion != 0 && this.iteracion % lapso == 0){
			double newp=ind.getpMut()-porcentajeDecrementado*ind.getpMut();
			if(newp > 0)
				ind.setpMut(newp);
		}
		return super.mutar(ind);
	}
	

}
